﻿
''' <summary>
''' Classe Utilitaire
''' </summary>
''' <remarks></remarks>
Public Module Utils

    ''' <summary>
    ''' Méthode permettant de transforrmer un taux annuel en taux mensuel
    ''' </summary>
    ''' <param name="taux">Valeur du taux annuel</param>
    ''' <param name="type_mens">Type de Mensualisation (équivalente ou proportionnelle)</param>
    ''' <returns>Taux mensualisé</returns>
    ''' <remarks>Si type_mens = 1, la fonction retourne un équivalent mensuel
    '''Sinon, elle retourne un taux proportionnel</remarks>
    Public Function Mensualise_tx(ByVal taux As Double, ByVal type_mens As TypeMensualisation) As Double
        Dim resultat As Double
        If type_mens = TypeMensualisation.TauxEquivalent Then
            resultat = (1 + taux) ^ (1 / 12) - 1
        ElseIf type_mens = TypeMensualisation.TauxProportionel Then
            resultat = taux / 12
        Else
            MsgBox("Un paramètre de mensualisation est incorrecte dans la fonction mensualise_tx")
        End If
        Return resultat
    End Function

    ''' <summary>
    ''' Méthode permettant de calculer une moyenne mobile
    ''' </summary>
    ''' <param name="tableauAlisser">Tableau des valeurs à lisser</param>
    ''' <param name="ordre">Nombre de décalages</param>
    ''' <returns>Tableau des données lissées</returns>
    ''' <remarks>Cette fonction renvoie le tableau t lissé par une ordre-moyenne mobile
    '''Le tableau en paramètre a la forme suivante :
    ''' - n éléments (1 seule dimension)
    ''' - un paramètre indique l'ordre de la moyenne mobile
    '''La fonction renvoie un tableau de double à une dimension</remarks>
    Public Function Moy_Mobile(ByVal tableauAlisser As Double(), ByVal ordre As Integer) As Double()

        Dim result(tableauAlisser.GetUpperBound(0)) As Double
        Dim t_travail As Double() = tableauAlisser

        For i = 0 To tableauAlisser.GetUpperBound(0)

            If i < Int(ordre / 2) + 1 Then
                result(i) = tableauAlisser(i)
            ElseIf i > tableauAlisser.GetUpperBound(0) - (Int(ordre / 2) + 1) Then
                result(i) = tableauAlisser(i)
            Else
                Dim tot As Double = 0
                For j = i - Int(ordre / 2) To i + Int(ordre / 2)
                    tot = tot + tableauAlisser(j)
                Next j
                result(i) = tot / ordre
            End If

        Next i

        Return result

    End Function

End Module
